package com.t01.bdqn.design.proxy.dynamic;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class StudentCGlibProxy {

    /**
     * 工厂方法
     * @param target 需要被代理的类型，即代理类需要继承的父类型
     * @return 代理类的实例
     */
    public static <T> T create(Class<T> target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target); // 指定要继承的父类型，即需要被代理的类型
//        enhancer.setCallback(new MethodInterceptorImpl()); // 为重写的方法指定回调的MethodInterceptor


        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                before();
                Object result = methodProxy.invokeSuper(o,objects);

                return result;
            }
            public void before(){
                System.out.println("代理前的操作");
            }

        });

        return (T) enhancer.create(); // 动态生成子类，创建子类实例并返回
    }

}
